package com.vates.gestion.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.vates.gestion.dao.BaseDaoReserva;
import com.vates.gestion.entidades.Cliente;
import com.vates.gestion.entidades.Hotel;
import com.vates.gestion.entidades.Reserva;

@Repository(value = "reservaDao")
public class ReservaDaoImpl implements BaseDaoReserva<Reserva> {

	private EntityManager em;

	/*
	 * Sets the entity manager
	 */

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;

	}

	@Override
	@Transactional(readOnly = false)
	public Reserva nuevo(Reserva entidad) {

		return em.merge(entidad);
	}

	@Override
	public Reserva buscarPorId(Long id) {

		return em.find(Reserva.class, id);

	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<Reserva> buscarTodos() {

		return em.createQuery("select r from Reserva r order by r.id")
				.getResultList();

	}

	@SuppressWarnings("unchecked")
	@Override
	@Transactional(readOnly = true)
	public List<Reserva> buscarPorNombre(String nombre) {
		return em
				.createQuery(
						"select r from Reserva r where r.nombre LIKE :nombre order by r.id")
				.setParameter("nombre", nombre).getResultList();

	}

	@Override
	public void borrar(Reserva entidad) {

		em.remove(entidad);

	}

	@Override
	public Reserva modificar(Reserva entidad) {
		return em.merge(entidad);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Reserva> buscarPorClienteFechas(Cliente cliente, String fecha1,
			String fecha2) {
		return em
				.createQuery(
						"SELECT sum(r.cantidad) FROM Reserva r "
								+ " WHERE r.cliente = :cliente "
								+ " AND   ((r.fechaIni BETWEEN :fecha1 AND :fecha2) OR "
								+ "        (r.fechaFin BETWEEN :fecha1 AND :fecha2) OR "
								+ "        (r.fechaIni <= :fecha1 AND r.fechaFin >= :fecha2)) ")
				.setParameter("cliente", cliente)
				.setParameter("fecha1", fecha1).setParameter("fecha2", fecha2)
				.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Reserva> buscarPorHotelFechas(Hotel hotel, String fecha1,
			String fecha2) {
		return em
				.createQuery(
						"SELECT sum(r.cantidad) FROM Reserva r , TipoHabitacion t"
								+ " WHERE r.tipoHabitacion = t.idTipoHab"
								+ " AND t.hotel = :hotel"
								+ " AND   ((r.fechaIni BETWEEN :fechaIni AND :fechaFin) OR "
								+ "        (r.fechaFin BETWEEN :fechaIni AND :fechaFin) OR "
								+ "        (r.fechaIni <= :fechaIni AND r.fechaFin >= :fechaFin)) ")
				.setParameter("hotel", hotel).setParameter("fechaIni", fecha1)
				.setParameter("fechaFin", fecha2).getResultList();
	}
}
